﻿#ifndef ZMultiThreadCtrl_H
#define ZMultiThreadCtrl_H

/*******************************************************************************
** 任务控制器，使用线程池执行任务
**
**
*******************************************************************************/

#include <QObject>
#include <QSharedPointer>
#include <QMutex>
#include <QThreadPool>
#include <QMap>

#include "ZFCommonHeader.h"
#include "ZMultiThreadTask.h"

ZFLIB_BEGIN_NAMESPACE

class ZFLIB_API ZMultiThreadCtrl : public QObject
{
    Q_OBJECT
public:
    explicit ZMultiThreadCtrl(QObject *parent = 0);
    ~ZMultiThreadCtrl();

    // 添加处理任务
    void addTask(QSharedPointer<ZMultiThreadTask> task);

    // 停止所有任务
    void stopAll();

    // 设置本任务使用的最大线程数，默认为1
    void setMaxThreadCount(int max_thread_count);

private:
    // 尝试启动执行任务
    void tryStartNewTask();

private slots:
    // 监听任务结束信号
    void slotTaskProgressFinished();

private:
    // 等待中的任务队列
    QList<QSharedPointer<ZMultiThreadTask> > m_wait_task_queue;

    // 正在运行的任务列表
    QMap<ZMultiThreadTask *, QSharedPointer<ZMultiThreadTask> > m_running_tasks;

    // 队列锁
    QMutex m_mutex;

    // 最大线程数
    int m_max_thread_count;

    // 线程池
    QThreadPool m_thread_pool;
};

ZFLIB_END_NAMESPACE

#endif // ZMultiThreadCtrl_H
